home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 1999 August / SGI Freeware 1999 August.iso / dist / fw_emacs.idb / usr / freeware / share / emacs / 19.34 / lisp / spell.el.z / spell.el
Encoding:
Text File  |  1998-10-28  |  5.0 KB  |  155 lines

  1. ;;; spell.el --- spelling correction interface for Emacs.
  2.  
  3. ;; Copyright (C) 1985 Free Software Foundation, Inc.
  4.  
  5. ;; Maintainer: FSF
  6. ;; Keywords: wp, unix
  7.  
  8. ;; This file is part of GNU Emacs.
  9.  
  10. ;; GNU Emacs is free software; you can redistribute it and/or modify
  11. ;; it under the terms of the GNU General Public License as published by
  12. ;; the Free Software Foundation; either version 2, or (at your option)
  13. ;; any later version.
  14.  
  15. ;; GNU Emacs is distributed in the hope that it will be useful,
  16. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18. ;; GNU General Public License for more details.
  19.  
  20. ;; You should have received a copy of the GNU General Public License
  21. ;; along with GNU Emacs; see the file COPYING.  If not, write to the
  22. ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  23. ;; Boston, MA 02111-1307, USA.
  24.  
  25. ;;; Commentary:
  26.  
  27. ;; This mode provides an Emacs interface to the UNIX spell(1) program.
  28. ;; Entry points are `spell-buffer', `spell-word', `spell-region' and
  29. ;; `spell-string'.  These facilities are documented in the Emacs user's
  30. ;; manual.
  31.  
  32. ;;; Code:
  33.  
  34. (defvar spell-command "spell"
  35.   "*Command to run the spell program.")
  36.  
  37. (defvar spell-filter nil
  38.   "*Filter function to process text before passing it to spell program.
  39. This function might remove text-processor commands.
  40. nil means don't alter the text before checking it.")
  41.  
  42. ;;;###autoload
  43. (put 'spell-filter 'risky-local-variable t)
  44.  
  45. ;;;###autoload
  46. (defun spell-buffer ()
  47.   "Check spelling of every word in the buffer.
  48. For each incorrect word, you are asked for the correct spelling
  49. and then put into a query-replace to fix some or all occurrences.
  50. If you do not want to change a word, just give the same word
  51. as its \"correct\" spelling; then the query replace is skipped."
  52.   (interactive)
  53.   (spell-region (point-min) (point-max) "buffer"))
  54.  
  55. ;;;###autoload
  56. (defun spell-word ()
  57.   "Check spelling of word at or before point.
  58. If it is not correct, ask user for the correct spelling
  59. and `query-replace' the entire buffer to substitute it."
  60.   (interactive)
  61.   (let (beg end spell-filter)
  62.     (save-excursion
  63.      (if (not (looking-at "\\<"))
  64.      (forward-word -1))
  65.      (setq beg (point))
  66.      (forward-word 1)
  67.      (setq end (point)))
  68.     (spell-region beg end (buffer-substring beg end))))
  69.  
  70. ;;;###autoload
  71. (defun spell-region (start end &optional description)
  72.   "Like `spell-buffer' but applies only to region.
  73. Used in a program, applies from START to END.
  74. DESCRIPTION is an optional string naming the unit being checked:
  75. for example, \"word\"."
  76.   (interactive "r")
  77.   (let ((filter spell-filter)
  78.     (buf (get-buffer-create " *temp*")))
  79.     (save-excursion
  80.      (set-buffer buf)
  81.      (widen)
  82.      (erase-buffer))
  83.     (message "Checking spelling of %s..." (or description "region"))
  84.     (if (and (null filter) (= ?\n (char-after (1- end))))
  85.     (if (string= "spell" spell-command)
  86.         (call-process-region start end "spell" nil buf)
  87.       (call-process-region start end shell-file-name
  88.                    nil buf nil "-c" spell-command))
  89.       (let ((oldbuf (current-buffer)))
  90.     (save-excursion
  91.      (set-buffer buf)
  92.      (insert-buffer-substring oldbuf start end)
  93.      (or (bolp) (insert ?\n))
  94.      (if filter (funcall filter))
  95.      (if (string= "spell" spell-command)
  96.          (call-process-region (point-min) (point-max) "spell" t buf)
  97.        (call-process-region (point-min) (point-max) shell-file-name
  98.                 t buf nil "-c" spell-command)))))
  99.     (message "Checking spelling of %s...%s"
  100.          (or description "region")
  101.          (if (save-excursion
  102.           (set-buffer buf)
  103.           (> (buffer-size) 0))
  104.          "not correct"
  105.            "correct"))
  106.     (let (word newword
  107.       (case-fold-search t)
  108.       (case-replace t))
  109.       (while (save-excursion
  110.           (set-buffer buf)
  111.           (> (buffer-size) 0))
  112.     (save-excursion
  113.      (set-buffer buf)
  114.      (goto-char (point-min))
  115.      (setq word (downcase
  116.              (buffer-substring (point)
  117.                        (progn (end-of-line) (point)))))
  118.      (forward-char 1)
  119.      (delete-region (point-min) (point))
  120.      (setq newword
  121.            (read-input (concat "`" word
  122.                    "' not recognized; edit a replacement: ")
  123.                word))
  124.      (flush-lines (concat "^" (regexp-quote word) "$")))
  125.     (if (not (equal word newword))
  126.         (progn
  127.          (goto-char (point-min))
  128.          (query-replace-regexp (concat "\\b" (regexp-quote word) "\\b")
  129.                    newword)))))))
  130.  
  131.  
  132. ;;;###autoload
  133. (defun spell-string (string)
  134.   "Check spelling of string supplied as argument."
  135.   (interactive "sSpell string: ")
  136.   (let ((buf (get-buffer-create " *temp*")))
  137.     (save-excursion
  138.      (set-buffer buf)
  139.      (widen)
  140.      (erase-buffer)
  141.      (insert string "\n")
  142.      (if (string= "spell" spell-command)
  143.      (call-process-region (point-min) (point-max) "spell"
  144.                   t t)
  145.        (call-process-region (point-min) (point-max) shell-file-name
  146.                 t t nil "-c" spell-command))
  147.      (if (= 0 (buffer-size))
  148.      (message "%s is correct" string)
  149.        (goto-char (point-min))
  150.        (while (search-forward "\n" nil t)
  151.      (replace-match " "))
  152.        (message "%sincorrect" (buffer-substring 1 (point-max)))))))
  153.  
  154. ;;; spell.el ends here
  155.